package mvc;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import mvc.action.Action;
import mvc.action.LoginAction;
import mvc.action.ZhuceAction;
import mvc.form.ActionForm;
import mvc.form.LoginForm;
import mvc.util.FullBean;

public class ActionServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = -3803352556415512589L;

	/**
	 * Constructor of the object.
	 */
	public ActionServlet() {
		super();
	}

	/**
	 * Destruction of the servlet. <br>
	 */
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}

	/**
	 * The doGet method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		
		ActionForm form = FullBean.full(request);
//		System.out.println(form);
		
		Action action = null;
//		if (request.getParameter("sign").equals("mvc.form.LoginForm")) {
//			action = new LoginAction();
//		}
//		if (request.getParameter("sign").equals("mvc.form.ZhuCeForm")) {
//			action = new ZhuceAction();
//		}
		
		Map<String, String> map = ActionMapping.getMap();
		String actionName = map.get(request.getParameter("sign"));
		try {
			@SuppressWarnings("rawtypes")
			Class clazz = Class.forName(actionName);
			action = (Action) clazz.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		// dispatcher的用法
//		RequestDispatcher dispatcher = request.getRequestDispatcher("/路径.jsp");
//		request.setAttribute("sdfd", "参数对应的值，是Object类型");
//		// jsp页面获取，String s = (String) request.getAttribute("sdfd");
//		dispatcher.forward(request, response);
		
		String message = action.excute(form);// 接口回调模式
											// 父类里面没有子类里面的方法，但是实现的接口里面就有方法了，可以用被实现的接口直接执行统一定义的方法。
											// 要执行方法，就只能用接口了。
											// 继承可以用父类代表子类。
		
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println(message);
//		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
//		out.println("<HTML>");
//		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
//		out.println("  <BODY>");
//		out.print("    This is ");
//		out.print(this.getClass());
//		out.println(", using the GET method");
//		out.println("  </BODY>");
//		out.println("</HTML>");
		out.flush();
		out.close();
	}

	/**
	 * The doPost method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to post.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

	/**
	 * Initialization of the servlet. <br>
	 *
	 * @throws ServletException if an error occurs
	 */
	public void init() throws ServletException {
		// Put your code here
	}

}
